'use strict'

// 引入 模块 
let
    //引入 fs 模块 用于读取文件
    fs = require('fs'),
    // 引入 path 模块 用于获取文件或目录的路径
    path = require('path'),
    // 引入 路由 模块 用于 
    router = require('koa-router')();



// 搜索 controller 中 除 router.js 外的所有 路由文件
function searchController(dir) {
    let
        // 读取 当前目录下的所有文件
        files = fs.readdirSync(dir),
        // 筛选 除 router.js 文件外的所有 文件
        controllerFiles = files.filter(filename => {
            // 返回 满足 以 .js 结尾 并且 filename 不等于 index.js 外的文件
            return filename.endsWith('.js') && filename !== 'index.js';
        });
    // 返回 筛选完的路由文件 
    return controllerFiles;
}

// 便利 所有 搜索到的路由文件并注册
function regiestRouter(files, dir) {
    // 循环 查找所有 controllers 文件下 除 router.js 外的 所有路由文件
    files.forEach(item => {
        let
            // 获取 路由 绝对路径
            tmpFile = path.join(dir, item),
            // 引入 路由 文件
            tmpRoutes = require(tmpFile);
        // 循环 路由 文件 中的 对象
        for (let i in tmpRoutes) {
            let
                // 获取 属性值 是一个数组
                valueArr = tmpRoutes[i],
                // 获取 请求类型
                type = valueArr[0];
            // 判断 请求类型 调用 函数
            if (type === 'get') {
                // 如果 数组的长度等于2 那么正常处理
                if (valueArr.length === 2) {
                    let
                        // 获取 处理 函数
                        fn = valueArr[1];

                    router.get(i, fn);
                } else {
                    let
                        // 获取 阻止 跳转 函数
                        auth_fn = valueArr[1],
                        // 获取 处理 函数
                        fn = valueArr[2];
                    router.get(i, auth_fn, fn);
                }

            } else if (type === 'post') {
                // 如果 数组的长度等于2 那么正常处理
                if (valueArr.length === 2) {
                    let
                        // 获取 处理 函数
                        fn = valueArr[1]
                    router.post(i, fn);
                } else {
                    let
                        // 获取 阻止 跳转 函数
                        auth_fn = valueArr[1],
                        // 获取 处理 函数
                        fn = valueArr[2];
                    router.post(i, auth_fn, fn);
                }
            }
        }

    });
}


// 暴露模块 实现路由中间件的注册与调用
module.exports = function () {
    let
        // 定义 路径
        dir = __dirname,
        // 调用搜索方法 传入路径
        files = searchController(dir)
    // 调用注册路由方法
    regiestRouter(files, dir);
    // 路由需要启动 返回启动路由 的 方法
    return router.routes();
}